package com.xbongbong.pro.enums.vip.enums;

import com.xbongbong.pro.enums.PackageTypeEnum;
import com.xbongbong.pro.enums.menu.enums.CRMMenuEnum;
import com.xbongbong.pro.enums.menu.enums.FundManagementMenuEnum;
import com.xbongbong.saas.enums.XbbRefTypeEnum;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

/**
 * 维护高级版及旗舰版才能使用的saas系统菜单
 * 1、该枚举维护系统菜单哪些高级版可用，哪些旗舰版可用，使用时基于系统的默认规则（低版本的功能高版本肯定可用）
 * 2、在现有ProMenuHelp#getMenuList方法内加入过滤逻辑，根据当前公司的套餐版本，过滤不能查看的VIP菜单
 * 3、目前只维护了saas vip菜单，其他收入支出相关
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
@Getter
public enum VipSaasMenuEnum {

    /**
     * 资金相关，FundManagementMenuEnum内获取
     */
    //只有高级版及以上客户可用：其他收支单
    OTHER_FUND_MANAGEMENT(PackageTypeEnum.ADVANCED.getType(), FundManagementMenuEnum.OTHER_FUND_MANAGEMENT.getCode(), FundManagementMenuEnum.OTHER_FUND_MANAGEMENT.getAlias()),
    //只有高级版及以上客户可用：其他收入单
    OTHER_INCOME(PackageTypeEnum.ADVANCED.getType(), FundManagementMenuEnum.OTHER_INCOME.getCode(), FundManagementMenuEnum.OTHER_INCOME.getAlias()),
    //只有高级版及以上客户可用：其他支出单
    OTHER_EXPENSE(PackageTypeEnum.ADVANCED.getType(), FundManagementMenuEnum.OTHER_EXPENSE.getCode(), FundManagementMenuEnum.OTHER_EXPENSE.getAlias()),
    //只有高级版及以上客户可用：资金调拨单
    FUND_TRANSFER(PackageTypeEnum.ADVANCED.getType(), FundManagementMenuEnum.FUND_TRANSFER.getCode(), FundManagementMenuEnum.FUND_TRANSFER.getAlias()),
    //只有高级版及以上客户可用：知识库
    KNOWLEDGE_BASE(PackageTypeEnum.ADVANCED.getType(), CRMMenuEnum.KNOWLEDGE_BASE.getCode(), CRMMenuEnum.KNOWLEDGE_BASE.getAlias()),

    //只有旗舰版客户可用：竞争对手
    COMPETITOR(PackageTypeEnum.ULTIMATE.getType(), CRMMenuEnum.COMPETITOR.getCode(), CRMMenuEnum.COMPETITOR.getAlias()),

    ;

    /**
     * 至少需要哪种套餐及以上才可以使用
     * 如其他收入单只能高级版及以上客户可用，则该值为 PackageTypeEnum.ADVANCED.Type
     * @see com.xbongbong.pro.enums.PackageTypeEnum
     */
    private Integer minFeeType;
    /**
     * 对应各个菜单，如CRMMenuEnum、FundManagementMenuEnum等
     * @see XbbRefTypeEnum
     */
    private Integer code;
    /**
     * saas应用标示
     * 对应各个菜单，如CRMMenuEnum、FundManagementMenuEnum等
     */
    private String alias;

    VipSaasMenuEnum(Integer minFeeType, int code, String alias) {
        this.minFeeType = minFeeType;
        this.code = code;
        this.alias = alias;
    }

    /**
     * 获取当前公司套餐不能看到的菜单alias集合
     * @param feeType 套餐类型
     * @return java.util.List<java.lang.String>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public static List<String> getUnSeeMenuList(Integer feeType) {
        //当前公司套餐所能使用的套餐功能，比如旗舰版肯定能使用高级版相关功能
        List<Integer> usefulFeeTypeList = PackageTypeEnum.getLowFeeTypeList(feeType);
        //当前公司套餐不能看到的菜单
        List<String> unSeeMenuList = new ArrayList<>();
        for (VipSaasMenuEnum cache : values()) {
            //不包含则不能使用该菜单
            if (!usefulFeeTypeList.contains(cache.minFeeType)) {
                unSeeMenuList.add(cache.alias);
            }
        }
        return unSeeMenuList;
    }

    /**
     * 获取当前公司套餐不能看到的表单类型集合
     *
     * @param feeType
     * @return
     */
    public static List<Integer> getUnSeeFormList(Integer feeType) {
        //当前公司套餐所能使用的套餐功能，比如旗舰版肯定能使用高级版相关功能
        List<Integer> usefulFeeTypeList = PackageTypeEnum.getLowFeeTypeList(feeType);
        //当前公司套餐不能看到的菜单
        List<Integer> unSeeFormList = new ArrayList<>();
        for (VipSaasMenuEnum cache : values()) {
            //不包含则不能使用该菜单
            if (!usefulFeeTypeList.contains(cache.minFeeType)) {
                unSeeFormList.add(cache.code);
            }
        }
        return unSeeFormList;
    }
}
